Функции обработки записей

Синтаксис:

int ldbfAppend(ldbfDB *data)

Добавляет новую запись в таблицу. Если таблица имеет индексы, то они будут изменены. Возвращает -1 в случае ошибки, иначе 0. В случае добавления записи под транзакцией, текущий номер новой записи будет известен только после завершении транзакции, т.е. в процессе транзакции поле recno в data будет иметь значение 0.

Пример:

int sock;

ldbfDB *data;

ldbfFIELD *field;

   sock = ldbfConnect(servname); 
  data = ldbfOpen( sock, "TESTER" ); 
  ldbfGo(data,2); /* Перемещаемся на вторую запись */ 
  ldbfAppend(data); /* Добавляем копию текущей записи в конец таблицы*/ 
  ldbfBlank(data);  /* Делаем все поля текущей записи пустыми*/ 
  field = ldbfField( data, "ldbfFIELD_NAME" ); 
  /* назначаем значение полю 'ldbfFIELD_NAME' */ 
  ldbfAssign( field, "New Field Value" ); 
  ldbfAppend(data);  /* добаляем запись */ 
  ldbfClose(data); 
  ldbfShutdown(sock);

Синтаксис:

void ldbfBlank(ldbfDB *data)

Чистит буфер текущей записи.Все поля текущей записи становятся пустыми ( в xBase они заполняются пробелами ).

См. также:ldbfAppend()

Синтаксис:

int ldbfBottom(ldbfDB *data)

Устанавливает указатель текущей записи в конец таблицы. В буфер записи читается содержимое последней записи. Если был установлен текущей индекс, указатель будет установлен на последнюю запись согласно индексному выражению. Возвращает 0 в случае успеха, -1 в случае ошибки.

Пример:

/* Проход по таблице с конца */

ldbfSetTag(data,"no");

ldbfBottom(data);

while(!ldbf_errno) ldbfSkip(data,-1);

См. также:ldbfSkip()

Синтаксис:

ldbfDB *ldbfCreate(int sock,char *name,ldbfFIELDINFO *field_info,ldbfTAGINFO *tag_info)

Создает новую таблицу и возвращает указатель на структуру типа ldbfDB, в которой хранится информация по открытой таблице. Все функции работы с таблицами используют указатель на тип ldbfDB для ссылки на таблицу. 'field_info' содержит описание структуры таблицы, а 'tag_info' - структуру индексов данной таблицы. 'name' - имя создаваемой таблицы, оно является существующим в ldbf.conf алиасом. Если таблица по каким-то причинам не создана, возвращает 0 и устанавливает код ошибки в ldbf_errno.

Пользователь должен иметь права на создание таблиц, см. описание параметра create_allow в ldbf.conf.

Структура 'ldbfFIELD_INFO':

  typedef struct { 
   char name[11]; /* имя поля */ 
   char type;  /* тип поля - C, N, D, L, M */ 
   int len;  /* длина поля */ 
   int dec;  /* кол-во знаков после запятой */ 
  } ldbfFIELDINFO; 

Структура 'ldbfTAGINFO':


 typedef struct { 
   char name[11];  /* имя индекса */ 
   char expression[51]; /* выражение */ 
   char filter[51]; /* фильтр */ 
   char unique; /* 1, если индекс уникальный */ 
   char descending; /* 1, если индекс убывающий */ 
 } ldbfTAGINFO; 

Пример:


  int sock; 
  ldbfDB *data; 
  ldbfFIELDINFO dd[3]; /* 3 структуры для 2 полей, последняя должна быть заполнена нулем */ 
  ldbfTAGINFO t[2]; 
  memset(&dd,0,sizeof(dd)); 
  memset(&t,0,sizeof(t)); 
  strcpy(dd[1].name,"Name"); 
  dd[1].type = 'C'; /* символьное поле */ 
  dd[1].len = 10; 
  strcpy(dd[2].name,"Wage"); 
  dd[2].type = "N"; /* числовое поле */ 
  dd[2].len = 7; 
  dd[2].dec = 2; 
  strcpy(t[1].name,"TagThing"); 
  strcpy(t[1].expression,"Name"); 
  t[1].filter = 0; 
  t[1].unique = 0; 
  t[1].descending = 0;
sock = ldbfConnect(servname); data = ldbfCreate( sock,"NEW_DATA", &field_info, &tag_info ) ;

Синтаксис:

int ldbfDelete(ldbfDB *data)

Помечает текущую записькак удаленую. В первом байте текущей записи ставится знак '*', это означает, что данная запись удалена. Вы можете контролировать просмотр удаленных записей с помощью функции ldbfSetOnOff() c параметром SET_DELETED.

Пример:

int sock,ok;

ldbfDB *file;

sock = ldbfConnect(servname);

file = ldnfOpen( sock, "DATA" ) ;

ok = ldbfTop(file);

while (ok > 0) {

ok = ldbfDelete( file );

ok = ldbfSkip(file,2);

}

ldbfCloseall( sock );

ldbfShutdown(sock);

См. также:ldbfRecall()

Синтаксис:

int ldbfDeleted(ldbfDB *data)

Возвращает 1 если текущая запись является помеченной на удаление.

Пример:

     ldbfDB *db; 
     int sock; 
    if((sock = ldbfConnect("localhost"))) { 
       db = ldbfOpen(sock,"base"); 
       /* показывем все неудаленные записи */ 
       ldbfTop(db); 
       while(!ldbf_errno) { 
        if(!ldbfDeleted(db)) 
          printf("%s%s\n", ldbfValue("base","name"), 
           ldbfValue("base","post")); 
          ldbfSkip(db,1); 
       }  
     } 

Синтаксис:

int ldbfGo(ldbfDB *data,long record_number)

Устанавливает указатель текущей записина запись с номером 'record_number' и читает ее содержимоев локальный буфер. Возвращает 0 в случае успеха, -1 в случае ошибки.

Пример:

ldbfGo(data,20);

while(ldbfRecno(data) < 100 && !ldbf_errno) {

printf("%s\n",ldbfStr(ldbfField(data,"name")));

ldbfSkip(data,1);

}

Синтаксис:

int ldbfLock(ldbfDB *data,long record_num)

Блокирует запись с номером'record_num'. Если запись или вся таблица уже заблокирована другим пользователем, возвращается -1, иначе 0. После успешной блокировки никто не может изменить данную запись,она доступна только по чтению.

Пример:

ldbfDB *data;

data = ldbfOpen( sock, "DATA" );

if(!ldbfLock( data, 5 ))

printf( " Record 5 is now locked.\n" );

else

printf(" Record 5 is locked by another\n");

Синтаксис:

int ldbfFlock(ldbfDB *data)

Блокирует всю таблицу.Таблица становится доступна для других пользователей только по чтению. Если таблица не может быть заблокирована, возвращается -1.

Пример:

if(ldbfFlock(data) !=- 1) { /* заблокирована */

ldbfGo(data,5);

ldbfAssign(ldbfField(data,"name"),"John");

ldbfUpdate(data);

}

ldbfFunlock(data);

См. также:ldbfLock()

Синтаксис:

ldbfDB *ldbfOpen(int sock,char *name,int mode)

Oткрывает таблицу ивозвращает указатель на структуру ldbfDB. 'name' содержит алиас таблицы.

'mode' может принимать следующиезначения:

  1. 0 - нормальный режим;
  2. O_EX - эксклюзивный режим;
  3. O_RD - режим только для чтения;
  4. O_TTS - сбрасывает все изменения на диск.

Структура ldbfDB содержит следующие поля:

 typedef struct ldbfDB_s { 
 link_list link; 
 char alias[32]; /* алиас таблицы */ 
 int sock; /* номер соединения, возвращенный   ldbfConnect() */ 
 int handle;  /* номер таблицы */ 
 char *record;  /* содержимое текушей записи */ 
 int changed;  /* 1, если запись изменена */ 
 long recno; /* номер текущей записи */ 
 long reccount; /* общее кол-во записей в таблице */ 
 long record_width; /* длина записи */ 
 int set_deleted; /* 1, если пропускать удаленые записи */ 
 char tag[11]; /* имя текущего индекса */ 
 int n_fields; /* кол-во полей в записи */ 
 ldbfFIELD *fields; /* структура таблицы */ 
 int n_tags;  /* кол-во индексов */ 
 ldbfTAGINFO *tags; /* структура индексов */ 
} ldbfDB; 

См. также:ldbfClose(), ldbfCloseall()

Синтаксис:

int ldbfPosition(ldbfDB *data)

Возвращает позицию текущей записи в таблице,выраженную в процентах. В случае ошибки возвращает-1. Может быть полезна при использовании скроллинга при построении интерактивных программ.

См. также:ldbfPosition_set()

Синтаксис:

int ldbfPosition_set(ldbfDB *data,int per)

Устанавливает указатель текущей записи на позицию, соответсвующую числу 'per', выраженному в процентах. Например, если в таблице 100 записей и была выдана ldbfPosition_set( data,50), указатель установится на 50 запись, так как 50 процентов соответсвует записи с номером 50.

Синтаксис:

int ldbfRecall(ldbfDB *data,long rec)

Снимает пометку наудаление записи 'rec'. Если данная запись не помечена как удаленная, ничего не просходит.

Синтаксис:

long ldbfRecno(ldbfDB *data)

Возвращает номер текущей записи в таблице. В случае ошибки возвращает -1.

Синтаксис:

long ldbfReccount(ldbfDB *data)

Возвращает количество записей в таблице. В случае ошибки возвращает -1. Вы можете также получить информацию о количестве записей в таблице, взяв значение поля reccount в структуре 'data', но оно может не соответсвовать фактическому количеству записей в таблице. ldbfReccount() всегда возвращает реальное количество записей.

Пример:

printf("Старое кол-во:%ld Реальное кол-во %ld\n",

data->reccount.ldbfReccount(data));

Синтаксис:

void ldbfSetTag(ldbfDB *data,char *tagname)

Устанавливает текущий индекс. Он будет использоваться функцией ldbfSeek() в дальнейшем.

Синтаксис:

int ldbfSeek(ldbfDB *data,char *ptr)

Производит поиск в таблице, используя текущий индекс. Если поиск был успешный, найденая запись становится текущей. Если индекс типа Date, 'ptr' должна содержать значение в формате "CCYYMMDD". Если индекс строкового типа, 'ptr' может содержать любую строку, заканчивающуюся нулем. Если индекс числовой, 'ptr' должна содержать только числовые символы. Если запись найдена, возвращает 1.

Пример:

ldbfDB *people;

ldbfFIELD *age_field;

long julian_day;

int rc;

/* Предположим таблица имеет индексы: NAME_TAG, AGE_TAG, и BIRTH_TAG.*/

people = ldbfOpen( sock, "people", 0 );

/* NAME_TAG - строковый индекс */

ldbfSetTag(people,"NAME_TAG") ;

if(ldbfSeek( people, "FRED " ) == 0 )

printf( " FRED в записи:%d\n", people->recno );

/* AGE_TAG числовой индекс */

strcpy( people->tag, "AGE_TAG" ) ;

age_field = ldbfField( people, "AGE_ldbfFIELD") ;

rc = ldbfSeek( people, "0" ) ;

if(rc == 0)

printf( " Самый молодой: %d", ldbfDouble(age_field));

/* BIRTH_TAG индекс типа дата */

strcpy( people->tag, "BIRTH_TAG" ) ;

ldbfSeek( people, "19600415" ) ;

Синтаксис:

int ldbfLocateFirst(ldbfDB *data,char *begin,char *end,char *condition)

Функция предназначена для выборки нужных записей в одной таблице. Если установлен текущий индекс, то он будет использоваться. 'begin' предназначен для установки начала поиска, в противном случае сканирование производится от начала таблицы. Поиск ведется до тех пор, пока выражение 'end' входит в результат индексного выражения. 'condition' является xBase выражением, в котором можно использовать функции и операторы, допустимые в индексных выражениях. Как только условие 'condition' станет истинным, функция возвращает найденую запись. В случае достижения конца таблицы или если выражение 'end' ложно, возвращается -1.

Следует заметить, что поиск выполняется полностью на сервере, клиенту будет переслана только найденная запись.

Пример:

/* Таблица 'codes' имеет следующие поля:

code - код города,

city - название города.

Существует индекс по полю 'code'. */

ldbfSetTag(data,"code");

/* ищем первую запись в диапазоне кодов '044' на предмет кода, начинающегося на '0443' */

ldbfLocateFirst(data,"044","substr(kod,1,3)='044'",

"substr(code,1,4)='0443'");

Синтаксис:

int ldbfLocate(ldbfDB *data,char *end_cond,char *condition)

Аналогична функции ldbfLocateFirst(), но выполняет поиск, начиная со следующей от текущей записи. Если используется индекс, то поиск осуществляется до тех пор, пока выражение 'end_cond' истинно. В противном случае, используется последовательный поиск в таблице 'ldbfDB'.

Пример:

/* ищем первую запись в диапазоне кодов '044' на предмет кода, начинающегося на '0443' */

ldbfSetTag(data,"code");

ldbfLocateFirst(data,"044","substr(code,1,3)='044'",

"substr(code,1,4)='0443'");

while(!ldbf_errno) {

printf("%s\n",ldbfStr(ldbfField(data,"code")));

ldbfSkip(data,1);

ldbfLocate(data,"substr(code,1,3)='044'",

"substr(code,1,4)='0443'");

}

Синтаксис:

int ldbfSkip(ldbfDB *data,long num_records)

Функция пропускает 'num_records' записей относительно текущей записи. Если установлен текущий индекс, пропуск идет в последовательности данного индекса. Если 'num_records' больше нуля, пропускаются записи по направлению к концу таблицы, если меньше нуля - к началу. Указатель текущей записи меняется и установленная запись читается в буфер.

ldbf_errno может содержать в случае ошибки:

Пример:

/* Найдем последнюю запись в таблице, чье поле NAME field содержит "John". */

ldbfDB *name_list;

ldbfFIELD *name;

int ok;

name_list = ldbfOpen( sock, "NAMES" ,0);

name = ldbfField( name_list, "NAME" ) ;

ok = ldbfBottom(name_list);

while (!ok) {

if(strncmp(ldbfPtr(name), "John", 4) == 0) {

printf( " John в записи:%ld\n",name_list->recno ) ;

ldbfShutdown(sock);

exit(0);

}

ldbfSkip(name_list,-1);

}

printf( " John не найден\n" ) ;

Синтаксис:

int ldbfTop(ldbfDB *data)

Указатель текущей записи устанавливается в начало таблицы. Если был установлен текущей индекс, указатель будет установлен на первую запись согласно индексному выражению. Возвращает -1 в случае ошибки.

Пример:

ldbfDB *data;

...

ldbfTop(data);

while(!ldbf_errnno) {

...

ldbfSkip(data,1);

}

См. также:ldbfBottom(), ldbfSkip(), ldbfSeek()

Синтаксис:

void ldbfFunlock(ldbfDB *data)

Удаляет все блокировки из таблицы и разблокирует таблицу если таковая была заблокирована с помощью функции ldbfFlock().

См. также:ldbfUnlock()

Синтаксис:

void ldbfUnlock(ldbfDB *data,long rec)

Разблокирует запись 'rec' в таблице 'data'.

Пример:

ldbfDB *data;

...

ldbfGo(data,200);

/* выполняем какие либо действия, особбено если необходимо произвести изменения в форме ввода */

if(ldbfLock(data)) {

ldbfUpdate(data);

ldbfUnlock(data,ldbfRecno(data));

}

См. также:ldbfFunlock()

Синтаксис:

void ldbfZap(ldbfDB *data)

Удаляет физически все записи из таблицы. Таблица должна быть открыта в эксклюзивном режиме ( параметр O_EX в функцииldbfOpen()).

Синтаксис:

int ldbfDrop(int sock,char *db)

Удаляет таблицу. Пользователь должен иметь права на эту операцию (см. drop_allow в ldbf.conf). Возвращает -1, если таблица не может быть удалена.

Синтаксис:

char *ldbfAliasList(int sock)

Возвращает указательна строку, содержашую список таблиц,

доступных для открытия. Таблицы в списке разделены запятой. Если таблица доступна в режиме только для чтения, перед ее именем стоит знак подчеркивания '_'.

Пример:

int sock;

char *str,str1[20];

ldbfDB *db;

if((sock = ldbfConnect("localhost"))) {

str = ldbfAliasList(sock);

printf("Выберите таблицу:%s:",str);

gets(str1);

db = ldbfOpen(sock,str1);

}

Синтаксис:

ldbfTAGINFO *ldbfTaginfo(ldbfDB* data)

Возвращает структуру индексов таблицы. Данная структурахранится в структуре ldbfDB открытой таблицы.

Пример:

ldbfDB *data;

int i;

ldbfTAGINFO *taginfo;

. . .

taginfo = data->tags;

for(i = 0; taginfo[i].name[0] != '\0'; i++)

printf("%s|%s|%s|%d%d\n",taginfo[i].name,taginfo[i].expression,

taginfo[i].filter,taginfo[i].unique,tagonfo[i].descending);

Синтаксис:

void ldbfClose(ldbfDB* data)

Закрывает таблицу.

Синтаксис:

int ldbfUpdate(ldbfDB* data)

Обновляет текущую запись в таблице. При изменении значения поля записи и для сохранения результата необходимо вызывать данную функцию.

Пример:

ldbfDB *db;

. . .

ldbfBlank(db);

ldbfReplace("base","name","John");

ldbfReplace("base","post","manager");

ldbfUpdate(db);

. . .

См. также:ldbfAppend()

Синтаксис:

void ldbfFlush(ldbfDB* data)

Указывает серверу записать таблицу на диск. Все изменения,находящиеся в буфере сервера будут сброшены в файл.

Синтаксис:

ldbfDB *ldbfInsert (long sock,char *data,char *field_list,

char *values_list)

Добавляет запись в таблицу. Это аналог функции ldbfAppend() за исключением того, что изменения полей и добавление выполнены в одном операторе. Таблица необязательно должна быть открыта. При успешном выполнении функция вернет указатель на открытую таблицу. 'data' содержит алиас таблицы, 'field_list' - список полей через запятую, 'values_list' - список значений через запятую.

См. также:ldbfModify(), ldbfCreate(), ldbfAppend()

Пример:


   ldbfDB *data; 
   ldbfFIELD *name; 
  data = ldbfInsert(sock,"data","name,address,zip","John, New York, 12345"); 
  if(data) {                  /* добавление успешно, проверим это */ 
      name=ldbfField(data,"NAME"); 
      printf("%s\n",ldbfStr(name)); 
  } 

Синтаксис:

ldbfDB *ldbfModify(long sock,char *data,char *field_list,char *values_list)

Изменяет текущую запись. Соответсвует ldbfUpdate(), но делает это в одной функции. Возвращает указатель на открытую таблицу.

Пример:

ldbfDB *data = ldbfOpen(sock,"data");

ldbfGo(data,10);

ldbfModify(sock,"data","name,address,zip","John,

New York,12345");

ldbfGo(data,11);

ldbfModify(sock,"data","name,address,zip","Joe,

Los Angeles,4758");

См. также:ldbfInsert(), ldbfUpdate()

Синтаксис:

ldbfDB *ldbfCreateDBF(long sock,char *data,char *field_list,char *tag_list)

Создает новую таблицу.Аналогична функции ldbfCreate(), но более компактна.

Формат списка полей:

field_list = field_name(type[:len[:dec]]); field_name(type[:len[:dec]])

где:

Формат списка индексов:

tag_list = tag_name(expression[:filter[:unique[:descending]]]);

где:

Пример:

data=ldbfCreateDBF(sock,"data","name(C:25);address(C:50);zip(N:10:1)", "name(name); address(address::1); zip(zip,zip>0:1:1)");

См. также:ldbfCreate()